#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "errors.h"
#include "tablero.h"

#define MAX_PATH_LEN 100

typedef enum {FB=0, IN} solucionT;

int g_debug=0;
static char g_path_tablero[MAX_PATH_LEN];
static solucionT g_solucion=FB;

static int obtieneArgumentos(int cant, char* args[]);
static void obtieneArgumentosError(int ret);

int
main(int argc, char* argv[])
{
  int ret;
  tableroT tablero;

  if(argc==6)
  {
    ret = obtieneArgumentos(argc, argv);
    if(ret<0)
    {
      obtieneArgumentosError(ret);
      return -1;
    }
  }
  else
  {
    printf(ERR_PARAM);
    return -1;
  }

  tablero = newTablero(g_path_tablero);
  if(tablero == NULL)
  {
    printf(ERR_TABLERO)
    return -2;
  }

  //ToDo resolver el tablero por el metodo seleccionado
  switch(g_solucion)
  {
    case 'FB':
      printDebug("Solucionando por FB");
      //flowFB(tablero);
      break;
    case 'IN':
      printDebug("Solucionando por IN");
      //flowIN(tablero);
      break;
    default:
      printDebug("Sin metodo de solucion");
      printf(ERR_METODO);
      return -1;
  }

  freeTablero(tablero);

  return 0;
}

static int
obtieneArgumentos(int cant, char* args[])
{
  char parametro;
  int i=0, j=0;

  //validaciones:
  if(cant <= 1)
  {
    return -1; //error en cantidad de parametros
  }

  if(args == NULL)
  {
    return -2; //error cadena de argumentos
  }

  //lectura de parametros
  for(i=0, j=1; j<cant; i++,j++)
  {
    //printDebug("i = %d", i);
    //printDebug("j = %d", j);
    //printDebug("args[j] = %s", args[j]);

    //valido que venga un -d, -D, -s, -S, -t o -T como parametro
    if(args[j]==NULL || strlen(args[j])!=2 || args[j][0]!='-')
    {
      return -2; //error cadena de argumentos
    }

    //un caso para cada posible comando de mi programa
    switch(args[j][1])
    {
      //CASO DEBUG
      case 'd':
      case 'D':
        g_debug = 1;
        //printDebug("Parametro D: %c", args[j][1]);
        break;
      //CASO SOLUCION
      case 's':
      case 'S':
        //printDebug("Parametro S: %c", args[j][1]);
        //tiene que tener un valor para este parametro
        if(args[j+1] != NULL)
        {
          //printDebug("args[j+1] = %s", args[j+1]);
          //no puede ser otro parametro, no puede empezar con -
          if(args[j+1][0]!='-')
          {
            if(strcmp(args[j+1], "FB") == 0)
            {
              printDebug("Valor del parametro S: %s", args[j+1]);
              g_solucion = FB;
            }
            else if(strcmp(args[j+1], "IN") == 0)
            {
              printDebug("Valor del parametro S2: %s", args[j+1]);
              g_solucion = IN;
            }
            else
            {
              printDebug("Valor del parametro S3: %s", args[j+1]);
              return -3; //error de valor del parametro S
            }
          }
          j++;
        }
        else //args[j+1] = null
        {
            return -3; //error de valor del parametro S
        }
        break;
      //CASO TABLERO
      case 't':
      case 'T':
        //printDebug("Parametro T: %c", args[j][1]);
        //tiene que tener un valor para este parametro
        if(args[j+1] != NULL)
        {
          //printDebug("args[j+1] = %s", args[j+1]);
          //no puede ser otro parametro, no puede empezar con -
          if(args[j+1][0]!='-')
          {
            //guardo el directorio y valido si existe
            strcpy(g_path_tablero, args[j+1]);
            if(!dirExists(g_path_tablero))
            {
              printDebug("No existe el path: %s", g_path_tablero);
              return -4; //error de valor del parametro T
            }
            printDebug("Path valido: %s", g_path_tablero);
            j++;
          }
        }
        else //args[j+1] = null
        {
            return -4; //error de valor del parametro T
        }
        break;
      default:
        printDebug("Parametro no encontrado");
        return -5; //error de parametro recibido
    }
  }

  return 0;
}

static void
obtieneArgumentosError(int ret)
{
  switch(ret)
  {
    case -1:
    case -2:
    case -4:
    case -5:
      printf(ERR_PARAM);
      break;
    case -3:
      printf(ERR_CLARGS);
      break;
    default:
      printf(ERR_GEN);
  }
}
